<?php

App::uses('AppModel', 'Model');

class Horario extends AppModel {
    /**
     * 				MODEL DATA MEMBERS
     */

    /**
     * Nombre de la tabla en base de datos
     *
     * Tabla relacionada con el modelo en cuestión, este atributo será usado para la generación
     * de consultas a la base de datos
     *
     * @var string
     */
    public $useTable = "horarios";

    /**
     * Clave primaria de la base de datos
     *
     * clave primaria que indentifica cada registro de la tabla en cuestión
     *
     * @var string
     */
    public $primaryKey = "id_horario";

    /**
     * Nombre del campo que se muestra cuando se hacen busquedas del modelo
     *
     * Nombre del campo que se muestra cuando se hacen busquedas del modelo
     *
     * @var string
     */
    public $displayField = "nombre_horario";

    /**
     * Nivel de recusividad para la busqueda de entidades relacionadas
     *
     * Este campo sirve para indicar si una consulta debe incluir las entidades
     * relacionadas con el modelo en cuestión, -1 quiere decir, 0 q.. y 1 ..
     *
     * @var int
     */
    public $recursive = -1;

    /**
     * Nombre del modelo
     *
     * Nombre del modelo para un alias las consultas y busquedas, ingresos y
     * otras interacciones con la base de datos.
     *
     * @var string
     */
    public $name = "Horario";

    /**
     * Orden por defecto
     *
     * Orden por defecto para las consultas que se realicen a la base de datos,
     * se pueden incluir varios campos de la base de datos. Y si se especifica
     * otro orden este no se tiene en cuenta.
     *
     * @var array(string)
     */
    public $order = array("Horario.id_horario");
    public $hasMany = array(
        "Recorrido" => array(
            "className" => "Recorrido",
            "foreignKey" => "id_horario",
        //"conditions" => array("OtroModelo2.campo1" => activo,),
        //"order" => array("OtroModelo2.campo1",),
        //"limit" => 3,	//Maximo numero de registros asociados que se desea retornar. Si se quieren retornar todos los registros, borrar linea
        //"dependent" => true,	//Si es true, metodo delete() del modelo es llamado con el parametro cascade como true borrando los datos asociados también
        ),
    );


    /**
     * 				DATA VALIDATION METHODS
     */

    /**
     * Validaciones del modelo
     *
     * Validaciones de los diferentes campos que se usan en el modelo
     *
     * @var array(array(string))
     */
    public $validate = array(
        "id_horario" => array(
            "notEmpty-1" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => "update",
                "message" => "Id del horario no puede estar vacio",
            ),
            "naturalNumber_NoZero-2" => array(
                "rule" => array("naturalNumber", false),
                "message" => "Id del horario debe ser un número entero diferente de cero",
            ),
            "isUnique-4" => array(
                "rule" => array("isUnique"),
                "message" => "Id del horario debe ser único",
            ),
        ),
        "nombre_horario" => array(
            "notEmpty-1" => array(
                "rule" => "notempty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "El nombre del horario no puede estar vacio",
            ),
            "maxLength-2" => array(
                "rule" => array('maxLength', 30),
                "message" => "Ha sobrepasado el maximo de 30 caracteres",
            ),
        ),
        "dias_aplica" => array(
            "notEmpty-1" => array(
                "rule" => "notempty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "Los dias que aplica no puede estar vacio",
            )
        ),
        "hora_salida" => array(
            "notEmpty-1" => array(
                "rule" => "notempty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "La hora de salida no puede estar vacia",
            ),
            "time-2" => array(
                "rule" => "time",
                "message" => "No ha ingresado una hora valida",
            ),
        ),
        "hora_estimada_llegada" => array(
            "notEmpty-1" => array(
                "rule" => "notempty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "La hora de llegada estimada no puede estar vacia",
            ),
            "time-2" => array(
                "rule" => "time",
                "message" => "No ha ingresado una hora valida",
            ),
        ),
        "estado_horario" => array(
            "notEmpty-1" => array(
                "rule" => "notempty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "El estado esta vacio",
            ),
            "inList-2" => array(
                "rule" => array("inList", array("activo", "inactivo")),
                "message" => "El estado solo puede ser activo/inactivo",
            ),
        ),
        "fecha_creacion_horario" => array(
            "notEmpty-1" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => "create",
                "message" => "La fecha de creacion no puede estar vacia",
            ),
            "datetime-2" => array(
                "rule" => "datetime", //array('datetime','ymd'),
                "message" => "Ha ingresado un formato incorrecto de fecha",
            ),
        ),
        "fecha_modificacion_horario" => array(
            "notEmpty-1" => array(
                "rule" => "notEmpty",
                "allowEmpty" => false,
                "required" => true,
                "message" => "La fecha de modificacion no puede estar vacia",
            ),
            "datetime-2" => array(
                "rule" => "datetime", //array('datetime','ymd'),
                "message" => "Ha ingresado un formato incorrecto de fecha",
            ),
        ),
    );

    /**
     * 				MODEL CALLBACKS METHODS
     */
    // public function beforeFind(array $queryData) {
    // }
    // public function afterFind(array $results, boolean $primary = false) {
    // }
    // public function beforeValidate($options = array()) {
    //  }
    // public function beforeSave(array $options = array()) {
    // }
    // public function afterSave(boolean $created) {
    // }
    // public function beforeDelete(boolean $cascade = true) {
    // }
    // public function afterDelete() {
    // }

    /**
     * 				MODEL METHODS
     */

    /**
     * funcion save
     *
     * Coloca el valor de las fechas de creacion y modificacion al principio, luego cuando se llama
     * para modificar, verifica si la fecha de creacion ya esta establecida y no la edita
     */
    public function save($data = null, $validate = true, $fieldList = array()) {
        $this->set($data);
        if (!isset($data['Horario']['fecha_creacion_horario'])) {
            $this->set(array('fecha_creacion_horario' => date("Y/m/j H:i:s")));
            $this->set(array('estado_horario' => "activo"));
        }
        if (isset($this->data['Horario']['dias_aplica'])) {
            $this->data['Horario']['dias_aplica'] = implode("-", $this->data['Horario']['dias_aplica']);
        }

        $this->set(array('fecha_modificacion_horario' => date("Y/m/j H:i:s")));
        return parent::save($this->data, $validate, $fieldList);
    }

    public function delete($id = null, $cascade = true) {
        $horario = $this->find('first', array(
            'conditions' => array('Horario.id_horario' => $id),
            'recursive' => 1,
        ));
        $hasChilds = false;
        foreach ($horario as $child_model => $i) {
            if (in_array($child_model, array("Recorrido")) && sizeof($horario[$child_model]) != 0) {
                $hasChilds = true;
                break;
            }
        }
        if (!$hasChilds) {
            $db = $this->getDataSource();
            $db->begin();

            $deleteHorario = parent::delete($id, $cascade);
            if ($deleteHorario) {
                $db->commit();
                return true;
            } else {
                $db->rollback();
                return false;
            }
        } else {
            $horario["Horario"]["estado_horario"] = "inactivo";
            return parent::save($horario["Horario"]);
        }
    }

}

?>